use std::sync::mpsc::SyncSender;

use glam::DVec3;

use crate::*;

pub fn demo4(tx: SyncSender<(usize, DVec3)>) -> (Renderer, Box<dyn Hitable>) {
    let mut scene = Hitables::default();

    let red     = LambertMaterial::new(dvec3(0.65, 0.05, 0.05));
    let white   = LambertMaterial::new(dvec3(0.73, 0.73, 0.73));
    let green   = LambertMaterial::new(dvec3(0.12, 0.45, 0.15));

    let light = MatDiffuseLight::new(dvec3(15.0, 15.0, 15.0));

    scene.add(Quad::new(
        dvec3(555.0,   0.0,   0.0),
        dvec3(  0.0, 555.0,   0.0),
        dvec3(  0.0,   0.0, 555.0),
        green,
    ));
    scene.add(Quad::new(
        dvec3(  0.0,   0.0,   0.0),
        dvec3(  0.0, 555.0,   0.0),
        dvec3(  0.0,   0.0, 555.0),
        red.clone(),
    ));

    scene.add(Quad::new(
        dvec3( 113.0, 554.0,  127.0),
        dvec3( 330.0,   0.0,    0.0), 
        dvec3(   0.0,   0.0, 305.0),
        light,
    ));

    scene.add(Quad::new(
        dvec3(  0.0,   0.0,   0.0),
        dvec3(555.0,  0.0,   0.0),
        dvec3(  0.0,   0.0, 555.0),
        white.clone(),
    ));
    scene.add(Quad::new(
        dvec3( 555.0, 555.0,  555.0),
        dvec3(-555.0,   0.0,    0.0),
        dvec3(   0.0,   0.0, -555.0),
        white.clone(),
    ));
    scene.add(Quad::new(
        dvec3(0.0, 0.0, 555.0),
        dvec3(555.0, 0.0,   0.0),
        dvec3(  0.0, 555.0, 0.0),
        white.clone(),
    ));

    let box1 = Translate::new(
        dvec3(130.0, 0.0, 65.0), 
        RotateY::new(
            -18.0,
            make_box(DVec3::ZERO, dvec3(165.0, 165.0, 165.0), white.clone()),
        )
    );

    let box2 = Translate::new(
        dvec3(265.0, 0.0, 295.0),
        RotateY::new(
            15.0,
            make_box(DVec3::ZERO, dvec3(165.0, 330.0, 165.0), white.clone()),
        )        
    );

    scene.add(ConstantMedium::new(Box::new(box1), 0.01, DVec3::ONE));
    scene.add(ConstantMedium::new(Box::new(box2), 0.01, DVec3::ZERO));

    let renderer = RendererBuilder::new(tx)
        .camera(
            dvec3(278.0, 278.0, -800.0),
            dvec3(278.0, 278.0, 0.0),
            dvec3(0.0, 1.0, 0.0),
            40.0,
        )
        .sample_count(200)
        .max_depth(50)
        .background(dvec3(0.0, 0.0, 0.0))
        .build();

    (renderer, Box::new(BVHNode::from(scene)))
}